/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.sistema.gestionuniversitaria.dataLayer;

import com.sistema.gestionuniversitaria.BusinessLayer.Profesor;
import java.sql.*;
import java.util.ArrayList;
import oracle.jdbc.OracleTypes;

/**
 *
 * @author PERSONAL
 */
public class ProfesorData extends BaseData {

    ArrayList<Profesor> profesores;

    public ProfesorData() {
    }

    public ArrayList<Profesor> getProfesores() throws ExcepcionGlobal, NoDataException {
        try {
            getConexion();
        } catch (ClassNotFoundException e) {
            throw new ExcepcionGlobal("No se ha localizado el driver");
        } catch (SQLException e) {
            throw new NoDataException("La base de datos no se encuentra disponible");
        }
        CallableStatement cstmt = null;
        ResultSet resultSet = null;
        profesores = new ArrayList<Profesor>();
        try {
            cstmt = conexion.prepareCall("{?=call BUSCAR_PROFESORES()}");
            cstmt.registerOutParameter(1, OracleTypes.CURSOR);
            cstmt.execute();
            resultSet = (ResultSet) cstmt.getObject(1);
            while (resultSet.next()) {
                Profesor profesor = new Profesor();
                profesor.setCedula(resultSet.getString("cedula"));
                profesor.setNombre(resultSet.getString("nombre_profe"));
                profesor.setApellidos(resultSet.getString("apellidos"));
                profesor.setTelefono(resultSet.getString("telefono"));
                profesor.setEmail(resultSet.getString("email"));
                profesores.add(profesor);
            }
        } catch (SQLException e) {
            throw new ExcepcionGlobal("Datos no validos o nulos");
        } finally {
            try {
                if (resultSet != null) {
                    resultSet.close();
                }
                if (cstmt != null) {
                    cstmt.close();
                }
                desconectar();
            } catch (SQLException e) {
                throw new ExcepcionGlobal("Datos invalidos o nulos");
            }
        }

        if (profesores == null || profesores.isEmpty()) {
            throw new NoDataException("No hay datos relacionados con la búsqueda efectuada");
        }

        return profesores;
    }

    public Profesor getProfesorPorCedula(String cedula) throws ExcepcionGlobal, NoDataException {
        try {
            getConexion();
        } catch (ClassNotFoundException e) {
            throw new ExcepcionGlobal("No se ha localizado el driver");
        } catch (SQLException e) {
            throw new NoDataException("La base de datos no se encuentra disponible");
        }
        CallableStatement cstmt = null;
        ResultSet resultSet = null;
        Profesor profesor = new Profesor();
        try {
            cstmt = conexion.prepareCall("{?=call BUSCAR_PROFESOR_POR_CEDULA(?)}");
            cstmt.registerOutParameter(1, OracleTypes.CURSOR);
            cstmt.setString(2, cedula);
            cstmt.execute();
            resultSet = (ResultSet) cstmt.getObject(1);
            if (resultSet.next()) {
                profesor.setCedula(resultSet.getString("cedula"));
                profesor.setNombre(resultSet.getString("nombre_profe"));
                profesor.setApellidos(resultSet.getString("apellidos"));
                profesor.setTelefono(resultSet.getString("telefono"));
                profesor.setEmail(resultSet.getString("email"));
            }
        } catch (SQLException e) {
            throw new ExcepcionGlobal("Datos no validos o nulos");
        } finally {
            try {
                if (resultSet != null) {
                    resultSet.close();
                }
                if (cstmt != null) {
                    cstmt.close();
                }
                desconectar();
            } catch (SQLException e) {
                throw new ExcepcionGlobal("Datos invalidos o nulos");
            }
        }

        return profesor;
    }

    public ArrayList<Profesor> getProfesoresPOrNombre(String nombre) throws ExcepcionGlobal, NoDataException {
        try {
            getConexion();
        } catch (ClassNotFoundException e) {
            throw new ExcepcionGlobal("No se ha localizado el driver");
        } catch (SQLException e) {
            throw new NoDataException("La base de datos no se encuentra disponible");
        }
        String sqlSelectAlumno = "SELECT cedula,nombre_profe,apellidos,telefono,email FROM PROFESOR WHERE nombre_profe like '%" + nombre + "%'";

        PreparedStatement statement = null;
        ResultSet resultSet = null;
        profesores = new ArrayList<Profesor>();

        try {
            statement = conexion.prepareStatement(sqlSelectAlumno);
            resultSet = statement.executeQuery();

            while (resultSet.next()) {
                Profesor profesor = new Profesor();
                profesor.setCedula(resultSet.getString("cedula"));
                profesor.setNombre(resultSet.getString("nombre_profe"));
                profesor.setApellidos(resultSet.getString("apellidos"));
                profesor.setTelefono(resultSet.getString("telefono"));
                profesor.setEmail(resultSet.getString("email"));
                profesores.add(profesor);
            }
        } catch (SQLException e) {
            throw new ExcepcionGlobal("Datos no validos o nulos");
        } finally {
            try {
                if (resultSet != null) {
                    resultSet.close();
                }
                if (statement != null) {
                    statement.close();
                }
                desconectar();
            } catch (SQLException e) {
                throw new ExcepcionGlobal("Datos invalidos o nulos");
            }
        }

        return profesores;
    }

    //------------------------------------------------------------------------------//
    public void insertarProfesor(String cedula, String nombre, String apellidos, String telefono, String email) throws ExcepcionGlobal, NoDataException {
        try {
            getConexion();
        } catch (ClassNotFoundException e) {
            throw new ExcepcionGlobal("No se ha localizado el driver");
        } catch (SQLException e) {
            throw new NoDataException("La base de datos no se encuentra disponible");
        }
        CallableStatement cstmtInsertarProfesor = null;
        try {
            cstmtInsertarProfesor = conexion.prepareCall("{call INSERTAR_PROFESOR (?,?,?,?,?)}");
            cstmtInsertarProfesor.setString(1, cedula);
            cstmtInsertarProfesor.setString(2, nombre);
            cstmtInsertarProfesor.setString(3, apellidos);
            cstmtInsertarProfesor.setString(4, telefono);
            cstmtInsertarProfesor.setString(5, email);
            boolean resultado = cstmtInsertarProfesor.execute();
            if (resultado == true) {
                throw new NoDataException("No se realizo la inserción");
            }
        } catch (SQLException e) {
            e.printStackTrace();
            throw new ExcepcionGlobal("Datos no validos o nulos");
        } finally {
            try {
                if (cstmtInsertarProfesor != null) {
                    cstmtInsertarProfesor.close();
                }
                desconectar();
            } catch (SQLException e) {
                throw new ExcepcionGlobal("Datos invalidos o nulos");
            }
        }
    }

    /*
     * Actualizar un curso
     */
    public void actualiarProfesor(String cedula, String nombre, String apellidos, String telefono, String email) throws ExcepcionGlobal, NoDataException {
        try {
            getConexion();
        } catch (ClassNotFoundException e) {
            throw new ExcepcionGlobal("No se ha localizado el driver");
        } catch (SQLException e) {
            throw new NoDataException("La base de datos no se encuentra disponible");
        }
        CallableStatement cstmtActualizarProfesor = null;
        try {
            cstmtActualizarProfesor = conexion.prepareCall("{call ACTUALIZAR_PROFESOR (?,?,?,?,?)}");
            cstmtActualizarProfesor.setString(1, cedula);
            cstmtActualizarProfesor.setString(2, nombre);
            cstmtActualizarProfesor.setString(3, apellidos);
            cstmtActualizarProfesor.setString(4, telefono);
            cstmtActualizarProfesor.setString(5, email);
            boolean resultado = cstmtActualizarProfesor.execute();
            if (resultado == true) {
                throw new NoDataException("No se realizo la inserción");
            }
        } catch (SQLException e) {
            e.printStackTrace();
            throw new ExcepcionGlobal("Datos no validos o nulos");
        } finally {
            try {
                if (cstmtActualizarProfesor != null) {
                    cstmtActualizarProfesor.close();
                }
                desconectar();
            } catch (SQLException e) {
                throw new ExcepcionGlobal("Datos invalidos o nulos");
            }
        }
    }
    /*
     * Eliminar un curso
     */

    public void eliminarProfesor(String cedula) throws ExcepcionGlobal, NoDataException {
        try {
            getConexion();
        } catch (ClassNotFoundException e) {
            throw new ExcepcionGlobal("No se ha localizado el driver");
        } catch (SQLException e) {
            throw new NoDataException("La base de datos no se encuentra disponible");
        }
        CallableStatement cstmtEliminarProfesor = null;
        try {
            cstmtEliminarProfesor = conexion.prepareCall("{call ELIMINAR_PROFESOR (?)}");
            cstmtEliminarProfesor.setString(1, cedula);
            boolean resultado = cstmtEliminarProfesor.execute();
            if (resultado == true) {
                throw new NoDataException("No se realizo la inserción");
            }
        } catch (SQLException e) {
            e.printStackTrace();
            throw new ExcepcionGlobal("Datos no validos o nulos");
        } finally {
            try {
                if (cstmtEliminarProfesor != null) {
                    cstmtEliminarProfesor.close();
                }
                desconectar();
            } catch (SQLException e) {
                throw new ExcepcionGlobal("Datos invalidos o nulos");
            }
        }

    }
}
